#define _CRT_SECURE_NO_WARNINGS 1


//（1）运动员排名问题
//5位运动员参加了10米台跳水比赛，有人让他们预测比赛结果：
//A选手说：B第二，我第三；
//B选手说：我第二，E第四；
//C选手说：我第一，D第二；
//D选手说：C最后，我第三；
//E选手说：我第四，A第一；
//比赛结束后，每位选手都说对了一半，请编程确定比赛的名次。


//这种问题的本质还是穷举法，使用循环将所有的情况一一列举出来

//------------方法1
//#include<stdio.h>
//int main(void) {
//	//因为有五个变量，所以要有五层循环.首先是定义五个变量
//	int a, b, c, d, e=0;
//	for (a = 1; a <= 5; a++) {
//		for (b = 1; b <= 5; b++) {
//			for (c = 1; c <= 5; c++) {
//				for (d = 1; d <= 5; d++) {
//					for (e = 1; e <= 5; e++) {
//                    
//					//这里的if判断能够简单点，全部写在一个括号里面，并用 &&链接
//						if ((a == 3 && b != 2) || (b == 2 && a != 3)) {
//							if ((b == 2 && e != 4) || b != 2 && e == 4) {
//								if ((c == 1 && d != 2) || c != 1 && d == 2) {
//									if ((d == 3 && c != 5) || d != 3 && c == 5) {
//										if ((e == 4 && a != 1) || e != 4 && a == 1) {
//											if (a*b*c*d*e==120) {//这句话是用来判断唯一性的
//												printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
//											}
//
//										}
//									}
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//	}
//}




//---------------方法二    这样写将会大大的较少运行的时间
//#include <stdio.h>
//
//void swapArgs(int* a, int* b) //交换函数
//{
//	int tmp;
//
//	tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
//void diveRank(int* p, int n)
//{
//	if (n >= 5) //此时的n也是用来控制循环层数的。
//	{
//		if ((p[1] == 2) + (p[0] == 3) == 1 && //B第二，我第三
//			(p[1] == 2) + (p[4] == 4) == 1 && //我第二，E第四
//			(p[2] == 1) + (p[3] == 2) == 1 && //我第一，D第二
//			(p[2] == 5) + (p[3] == 3) == 1 && //C最后，我第三
//			(p[4] == 4) + (p[0] == 1) == 1)   //我第四，A第一
//			//由于此时是执行的全排列，所以查重也省了。
//		{
//			for (int i = 0; i < 5; i++)
//			{
//				printf("%d ", p[i]);
//			}
//			putchar('\n');
//		}
//		return;
//	}
//
//	int i;
//	for (i = n; i < 5; i++) //这个递归方式就完成了对1~5的全排列，方法是从后向前不停的执行交换。将这个递归程序写回成循环后，可以更好的理解。
//	{
//		swapArgs(p + i, p + n);
//		diveRank(p, n + 1);
//		swapArgs(p + i, p + n);
//	}
//}
//
//int main()
//{
//	int p[5] = { 1, 2, 3, 4, 5 }; //当然由于是全排列，所以初值必须给好。
//
//	diveRank(p, 0);
//
//	return 0;
//}








//（2）判断凶手
//日本某地发生了一件谋杀案，警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
//以下为4个嫌疑犯的供词:
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//已知3个人说了真话，1个人说的是假话。
//现在请根据这些信息，写一个程序来确定到底谁是凶手。stdio.h

//#include<stdio.h>
//
////假设说     犯人是1，其余人是0   。因为要判断四次，所有4中情况
//int main(void) {
//	int a=0, b=0, c=0, d = 0;
//	for (a = 0; a <= 1; a++) {
//		for (b = 0; b <= 1; b++) {
//			for (c = 0; c <= 1; c++) {
//				for (d = 0; d <= 1; d++) {
//					//假设每个人说的都是真话
//					if ((a!=1) + (c==1) + (d==1) + (d!=1)==3) {//判断的句子相加和为三才是真的，因为只有一个犯人说假话
//						if (a + b + c + d == 1) {
//							if (a == 1) {
//								printf("%c", 'a');
//							}
//							else if (b == 1) {
//								printf("%c", 'b');
//							}
//							else if (c == 1) {
//								printf("%c", 'c');
//							}
//							else
//							{
//								printf("%c", 'd');
//							}
//						}
//
//					}
//				}
//			}
//		}
//	}
//}